Problem
【ONTAK2010】Peaks加强版
Description
在有座山峰,每座山峰有他的高度。
有些山峰之间有双向道路相连,共条路径,每条路径有一个困难值,这个值越大表示越难走。
现在有组询问,每组询问询问从点开始只经过困难值小于等于的路径所能到达的山峰中第高的山峰,如果无解输出。
Input
第一行三个数。
第二行个数,第个数为。
接下来行,每行个数,表示从到有一条困难值为的双向路径。
接下来行,每行三个数,表示一组询问。
,,,如果则不变。
Output
Sample Input
1 | 10 11 4 |
Sample Output
1 | 6 |
HINT
,,
标签:Kruskal重构树
DFS序
主席树
Solution
这道题是BZOJ3545【ONTAK2010】Peaks的强制在线版本。
无法离线,则不能只加边不删边,于是无法直接线段树合并。
这里需要引入这一概念。
对于一个图,我们对其构建:
为每条边都设置一个点,点权为该边边权;为每个点(连同边代表的点)一起建立并查集。
- 找出当前没有尝试过的最小的边,判断其两端点和的连通性
- 若两端点尚未联通,则将和的祖先用并查集并到边所代表的点上,这时在重构树上加边,
- 若当前所有原树上的点都在同一个并查集中,则退出,否则返回步骤
下图是一个的例子,其四个性质在下方标注
不难发现,由于其是一个大根堆,从一个点出发,只走边权小于等于的点所能到达的点,一定是重构树上一个边所代表的点的子树的所有叶子节点。这样我们在重构树上倍增预处理一下,即可在的时间内找到每个询问对应的上述的这个点。对整棵重构树做树上主席树,即可在的时间内找到第大的点权。
综上,先跑建立重构树,并在重构树上倍增预处理和树上值域主席树预处理。随后对每次询问,先倍增跳到权值小于等于的层数最浅的结点,再在此结点子树的序区间中询问第大权值即可,时间复杂度。
Code
1 |
|